perm filename HASH.PAS[S1,ALS]1 blob
sn#419037 filedate 1979-02-18 generic text, type C, neo UTF8
COMMENT ā VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 (*PROGRAM HEADER PAGE*)
C00005 00003 program PRINTHASH (INPUT,OUTPUT)
C00008 00004 function OPC_HASH (var MNEM : CHAR4) : integer
C00015 ENDMK
Cā;
(*PROGRAM HEADER PAGE*)
(*PAS10 OPTIONS*) (*$D+,R32,S1300*) (*X10S1*)
(* DEFAULT
D+ DEBUG AND POSTMORTEM DUMP -
E+ EXTERNAL CALLS TO LEVEL 1 PROCEDURES ALLOWED -
Fn FILE OPTION 1
I+ FORTRAN I/O IN EXTERNAL FORTRAN SUBROUTINES -
L+ OBJECT LISTING -
Rn SIZE OF LOW-SEGMENT (SEE PAS10 MANUAL)
Sn MAX INSTRUCTIONS PER STATEMENT 1000
T+ RUNTIME CHECK +
U+ 72 COLUMN FORMAT -
Xn HIGHEST REGISTER FOR PARAMETERS 6
*)
(*SLAC PCPASC OPTIONS*) (* B+,D+,M-*)
(* DEFAULT
A+ GENERATE 370 OBJECT MODULE -
A- GENERATE 370 ASSEMBLY MODULE
B+ BOUNDS CHECKING, BUT ALLOW 'BIG' CHARACTERS -
C+ EMIT PCODE +
D+ RUNTIME CHECKING OF POINTER, INDEX, SUBRANGE VALUES -
E+ FILE IS IN EBCDIC CHARACTER SET -
F+ SAVE FPR'S ON PROCEDURE/FUNCTION ENTRY +
K+ ENABLE STATEMENT EXECUTION COUNTING -
L+ LIST SOURCE PROGRAM +
M+ 72 COLUMN FORMAT +
P+ DOUBLE-WORD BOUNDARY ALIGNMENT -
S+ SAVE GPR'S ON PROCEDURE/FUNCTION ENTRY +
T+ PRINT SYMBOL TABLES (FOR POST-PROCESSOR) -
U+ GET STATISTICS?? 2ND PARAMETER TO PCODE BGN INSTR. -
V+ ?? 3RD PCODE BGN INSTRUCTION PARAMETER -
X+ USE ACTUAL PROCEDURE NAMES FOR EXTERNAL REFERENCES -
X- GENERATE UNIQUE 8-CHAR NAMES FOR EXTERNAL REFERENCES
*)
(*S1 PCPASC OPTION DIFFERENCES*) (* A+,B+,D+,L-,M120*) (*X10S1*)
(* DEFAULT
A+ GENERATE S1 ASSEMBLY MODULE -
A- GENERATE S1 OBJECT MODULE
*)
(* SLAC/PDP-10 TRANSPORT DEPENDENCIES FLAGGED WITH "XSL10" *)
(* PDP-10/S-1 TRANSPORT DEPENDENCIES FLAGGED WITH "X10S1" *)
program PRINTHASH (INPUT,OUTPUT);
const
(*OPCHTSIZE = 197;
OPCHTSIZEM1 = 196;*)
OPCHTSIZE = 223;
OPCHTSIZEM1 = 222;
(*OPCHTSIZE = 239;
OPCHTSIZEM1 = 238;*)
MAX = 2000000;
type
CHAR4 = packed array [1..4] of char;
U_OPCODE = ( U ,
UABS , UADD , UAND , UBGN , UCHKF, UCHKH, UCHKL, UCHKN,
UCHKT, UCHR , UCLAB, UCOMM, UCSP , UCUP , UDEAD, UDEC ,
UDEF , UDIF , UDIV , UDMD , UDOA , UDUP , UEND , UENT ,
UEQU , UFJP , UFLO , UFLT , UGEQ , UGRT , UIEQU, UIGEQ,
UIGRT, UILEQ, UILES, UINC , UIND , UINEQ, UINN , UINT ,
UIOR , UIXA , ULAB , ULCA , ULDA , ULDC , ULEQ , ULES ,
ULEX , ULIVE, ULOC , ULOD , UMDEF, UMOD , UMOV , UMPY ,
UMST , UMUS , UNEG , UNEQ , UNEW , UNOT , UNSTR, UODD ,
UORD , UOPTN, UPAR , UPLOD, UPSTR, URET , USGS , USQR ,
USTO , USTP , USTR , USUB , USWP , USYM , UTJP , UTRC ,
UTYP , UUJP , UUNI , UUNK , UXJP );
var
I : 0..OPCHTSIZEM1;
H : 0..OPCHTSIZEM1;
J : integer;
K : integer;
M1,M2,M3,M4 : integer;
OPC : U_OPCODE;
MNEM : CHAR4; (*7FEB79 ALS*)
OPCHASHTAB : array [0..OPCHTSIZEM1] of
record
OPCNAM : CHAR4;
OPC : U_OPCODE;
HIT : integer
end (*OPCHASHTAB*);
function OPC_HASH (var MNEM : CHAR4) : integer;
begin
OPC_HASH :=(((ord(MNEM[1])*M1 + ord(MNEM[2]))*M2 + ord(MNEM[3]))*M3
+ord(MNEM[4])*M4) mod OPCHTSIZE;
(* OPC_HASH := (ord(MNEM[1])*507 + ord(MNEM[2])*26 + ord(MNEM[3])
+ord(MNEM[4])*31) mod OPCHTSIZE; *)
(* OPC_HASH := (ord(MNEM[1])*1024 + ord(MNEM[2])*16 + ord(MNEM[3])*2
+ord(MNEM[4])*32) mod OPCHTSIZE; *)
end (*OPC_HASH*);
procedure ENTER_OPC (NAM : CHAR4; OPC : U_OPCODE);
var H : 0..OPCHTSIZEM1;
begin
H := OPC_HASH(NAM);
while OPCHASHTAB[H].OPCNAM <> ' ' do
begin
H := (H + 1) mod OPCHTSIZE;
J := J + 1;
end;
OPCHASHTAB[H].OPCNAM := NAM;
OPCHASHTAB[H].OPC := OPC;
(* OPCHASHTAB[H].HIT := K; *)
end (*ENTER_OPC*);
procedure PRINT_OPC;
var H : 0..OPCHTSIZEM1;
begin
WRITELN;
for H := 0 to OPCHTSIZEM1 do
begin
WRITE (OUTPUT,H,' ');
if OPCHASHTAB[H].OPCNAM = ' ' then WRITELN else
begin
WRITELN (OUTPUT,OPCHASHTAB[H].OPCNAM,OPCHASHTAB[H].OPC);
(* if OPCHASHTAB[H].HIT = 0 then WRITELN else
WRITELN (OUTPUT,OPCHASHTAB[H].HIT); *)
end;
end;
end;
begin (*MAIN PROGRAM*)
K := 1000;
M1 :=128;
while M1 <= MAX do
begin (* while M1 <= N *)
M2 := 1;
while M1 * M2 <= MAX do
begin
M3 := 1;
while M1 * M2 * M3 <= MAX do
begin
M4 := 1;
while ((M1 * M2 * M3 * M4 <= MAX) and (M4 < 8)) do
begin
for I := 0 to OPCHTSIZEM1 do
OPCHASHTAB[I].OPCNAM := ' ';
J := 0;
ENTER_OPC ('ABS ', UABS); ENTER_OPC ('ADD ', UADD);
ENTER_OPC ('AND ', UAND); ENTER_OPC ('BGN ', UBGN);
ENTER_OPC ('CHKF', UCHKF); ENTER_OPC ('CHKH', UCHKH);
ENTER_OPC ('CHKL', UCHKL); ENTER_OPC ('CHKN', UCHKN);
ENTER_OPC ('CHKT', UCHKT); ENTER_OPC ('CHR ', UCHR);
ENTER_OPC ('CLAB', UCLAB); ENTER_OPC ('COMM', UCOMM);
ENTER_OPC ('CSP ', UCSP); ENTER_OPC ('CUP ', UCUP);
ENTER_OPC ('DEAD', UDEAD); ENTER_OPC ('DEC ', UDEC);
ENTER_OPC ('DEF ', UDEF); ENTER_OPC ('DIF ', UDIF);
ENTER_OPC ('DIV ', UDIV); ENTER_OPC ('DMD ', UDMD);
ENTER_OPC ('DOA ', UDOA); ENTER_OPC ('DUP ', UDUP);
ENTER_OPC ('END ', UEND); ENTER_OPC ('ENT ', UENT);
ENTER_OPC ('EQU ', UEQU); ENTER_OPC ('FJP ', UFJP);
ENTER_OPC ('FLO ', UFLO); ENTER_OPC ('FLT ', UFLT);
ENTER_OPC ('GEQ ', UGEQ); ENTER_OPC ('GRT ', UGRT);
ENTER_OPC ('IEQU', UIEQU); ENTER_OPC ('IGEQ', UIGEQ);
ENTER_OPC ('IGRT', UIGRT); ENTER_OPC ('ILEQ', UILEQ);
ENTER_OPC ('ILES', UILES); ENTER_OPC ('INC ', UINC);
ENTER_OPC ('IND ', UIND); ENTER_OPC ('INEQ', UINEQ);
ENTER_OPC ('INN ', UINN); ENTER_OPC ('INT ', UINT);
ENTER_OPC ('IOR ', UIOR); ENTER_OPC ('IXA ', UIXA);
ENTER_OPC ('LAB ', ULAB); ENTER_OPC ('LCA ', ULCA);
ENTER_OPC ('LDA ', ULDA); ENTER_OPC ('LDC ', ULDC);
ENTER_OPC ('LEQ ', ULEQ); ENTER_OPC ('LES ', ULES);
ENTER_OPC ('LEX ', ULEX); ENTER_OPC ('LIVE', ULIVE);
ENTER_OPC ('LOC ', ULOC); ENTER_OPC ('LOD ', ULOD);
ENTER_OPC ('MDEF', UMDEF); ENTER_OPC ('MOD ', UMOD);
ENTER_OPC ('MOV ', UMOV); ENTER_OPC ('MPY ', UMPY);
ENTER_OPC ('MST ', UMST); ENTER_OPC ('MUS ', UMUS);
ENTER_OPC ('NEG ', UNEG); ENTER_OPC ('NEQ ', UNEQ);
ENTER_OPC ('NEW ', UNEW); ENTER_OPC ('NOT ', UNOT);
ENTER_OPC ('NSTR', UNSTR); ENTER_OPC ('ODD ', UODD);
ENTER_OPC ('ORD ', UORD); ENTER_OPC ('OPTN', UOPTN);
ENTER_OPC ('PAR ', UPAR); ENTER_OPC ('PLOD', UPLOD);
ENTER_OPC ('PSTR', UPSTR); ENTER_OPC ('RET ', URET);
ENTER_OPC ('SGS ', USGS); ENTER_OPC ('SQR ', USQR);
ENTER_OPC ('STO ', USTO); ENTER_OPC ('STP ', USTP);
ENTER_OPC ('STR ', USTR); ENTER_OPC ('SUB ', USUB);
ENTER_OPC ('SWP ', USWP); ENTER_OPC ('SYM ', USYM);
ENTER_OPC ('TJP ', UTJP); ENTER_OPC ('TRC ', UTRC);
ENTER_OPC ('TYP ', UTYP); ENTER_OPC ('UJP ', UUJP);
ENTER_OPC ('UNI ', UUNI); ENTER_OPC ('UNK ', UUNK);
ENTER_OPC ('XJP ', UXJP);
if J < K then
begin
K := J;
WRITELN (OUTPUT,M1,M2,M3,M4,K,' HITS');
if K = 0 then PRINT_OPC;
end; (* if J < K then *)
M4 := M4*2;
end; (* while M4 <= M3 do *)
M3 := M3*2;
end; (* while M3 <= M2 do *)
M2 := M2*2;
end; (* while M2 <= M1 *)
M1 := M1+1;
end; (* WHILE M1 < N *)
end. (* main*)